主题
释放指定图片内存1 - FreeImageData
函数简介
释放由插件独立堆分配的图像字节缓冲(delete[]),例如 BMP/PNG 文件字节流。
与 FreeImagePtr 职责不同:本接口释放的是 data 字节指针,不是 OLAImage 句柄。
接口名称
FreeImageDataDLL调用
int FreeImageData(long ola, long ptr);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
| ola | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
| ptr | 长整数型 | 独立分配的字节缓冲地址(见下方适用接口)。 |
适用 / 不适用
| 类别 | 接口 | 是否调用 FreeImageData |
|---|---|---|
| 需要 | GetImageBmpData 的 data | 必须 |
| 需要 | GetImagePngData 的 data | 必须 |
| 需要 | GetScreenDataBmp 的 data | 必须 |
| 禁止 | GetImageData 的 data | 禁止(内部视图,只 FreeImagePtr 句柄) |
| 禁止 | LoadImage / GetScreenDataPtr 等返回的图像句柄 | 禁止(应使用 FreeImagePtr) |
示例
SDK 调用
cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
long bmpPtr = 0; int bmpSize = 0;
if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
// 使用 bmpPtr / bmpSize ...
ola.FreeImageData(bmpPtr); // 释放 BMP 字节缓冲
}
ola.FreeImage(imgPtr); // 另释放图像句柄(SDK 常用 FreeImage)
}csharp
using OLAPlug;
var ola = new OLAPlugServer();
long imgPtr = ola.LoadImage(@"images\test.bmp");
if (imgPtr != 0)
{
if (ola.GetImageBmpData(imgPtr, out long bmpPtr, out int bmpSize) == 1)
{
ola.FreeImageData(bmpPtr);
}
ola.FreeImage(imgPtr);
}python
from OLAPlugServer import OLAPlugServer
ola = OLAPlugServer()
img_ptr = ola.LoadImage("images/test.bmp")
if img_ptr:
ret, bmp_ptr, bmp_size = ola.GetImageBmpData(img_ptr)
if ret == 1:
ola.FreeImageData(bmp_ptr)
ola.FreeImage(img_ptr)java
import com.olaplug.OLAPlugServer;
OLAPlugServer ola = new OLAPlugServer();
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
var bmp = ola.GetImageBmpData(imgPtr);
if (bmp != null && bmp.success) {
ola.FreeImageData(bmp.data.data);
}
ola.FreeImagePtr(imgPtr);
}go
import "github.com/ola/olaplug/olaplug"
ola, _ := olaplug.NewOLAPlugServer("OLAPlug_x64.dll")
defer ola.ReleaseObj()
imgPtr := ola.LoadImage("images/test.bmp")
if imgPtr != 0 {
bmpPtr := 0; int bmpSize = 0
if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
ola.FreeImageData(bmpPtr)
}
ola.FreeImage(imgPtr)
}rust
use olaplug::OLAPlugServer;
let ola = OLAPlugServer::new("OLAPlug_x64.dll").unwrap();
let imgPtr = ola.load_image("images/test.bmp");
if imgPtr != 0 {
let bmpPtr = 0; int bmpSize = 0;
if (ola.get_image_bmp_data(imgPtr, &mut bmpPtr as *mut i32, &mut bmpSize as *mut i32) == 1) {
ola.free_image_data(bmpPtr);
}
ola.free_image(imgPtr);
}cpp
var ola = com("OlaPlug.OlaSoft")
var imgPtr = ola.LoadImage("images/test.bmp")
if(imgPtr) {
var ret = ola.GetImageBmpData(imgPtr)
ola.FreeImageData(ret.data)
ola.FreeImage(imgPtr)
}vbscript
Set ola = CreateObject("OlaPlug.OlaSoft")
imgPtr = ola.LoadImage("images/test.bmp")
If imgPtr <> 0 Then
ret = ola.GetImageBmpData(imgPtr)
ola.FreeImageData ret(0)
ola.FreeImage(imgPtr)
End Iftext
.局部变量 ola, OLAPlug
.局部变量 imgPtr, 长整数型
.局部变量 bmpPtr, 长整数型
.局部变量 bmpSize, 整数型
ola.创建 ()
imgPtr = ola.LoadImage (“images/test.bmp”)
.如果真 (imgPtr ≠ 0)
.如果真 (ola.GetImageBmpData (imgPtr, bmpPtr, bmpSize) = 1)
ola.FreeImageData (bmpPtr)
.如果真结束
ola.FreeImagePtr (imgPtr)
.如果真结束aardio
import OLAPlugServer;
var ola = OLAPlugServer();
var imgPtr = ola.LoadImage("images/test.bmp");
if(imgPtr){
var ret, bmpPtr, bmpSize = ola.GetImageBmpData(imgPtr);
if(ret == 1){
ola.FreeImageData(bmpPtr);
}
ola.FreeImage(imgPtr);
}text
变量 ola <类型 = OLAPlugServer>
ola = 新建 OLAPlugServer
长整数 imgPtr = ola.LoadImage("images/test.bmp")
如果真 (imgPtr ≠ 0)
{
长整数 bmpPtr = 0
整数 bmpSize = 0, ret = 0
ret = ola.GetImageBmpData(imgPtr, bmpPtr, bmpSize)
如果真 (ret = 1)
{
ola.FreeImageData(bmpPtr)
}
ola.FreeImagePtr(imgPtr)
}cpp
#include "OLAPlugServer.h"
OLAPlugServer ola;
long imgPtr = ola.LoadImage("images/test.bmp");
if (imgPtr != 0) {
long bmpPtr = 0; int bmpSize = 0;
if (ola.GetImageBmpData(imgPtr, &bmpPtr, &bmpSize) == 1) {
ola.FreeImageData(bmpPtr);
}
ola.FreeImage(imgPtr);
}原生 DLL 调用
cpp
long instance = CreateCOLAPlugInterFace();
long imgPtr = LoadImage(instance, "images/test.bmp");
long bmpPtr = 0; int bmpSize = 0;
if (GetImageBmpData(instance, imgPtr, &bmpPtr, &bmpSize) == 1) {
FreeImageData(instance, bmpPtr);
}
FreeImagePtr(instance, imgPtr);csharp
GetImageBmpData(instance, imgPtr, out long bmpPtr, out int bmpSize);
FreeImageData(instance, bmpPtr);
FreeImagePtr(instance, imgPtr);python
data = c_int64(0); size = c_int(0)
ola.GetImageBmpData(instance, img_ptr, byref(data), byref(size))
ola.FreeImageData(instance, data)
ola.FreeImagePtr(instance, img_ptr)返回值
| 返回值 | 说明 |
|---|---|
1 | 成功。 |
0 | 失败。 |
注意事项
结论:GetImageData 的 data 不要 用本接口释放;FreeImagePtr 也不会 自动释放本接口负责的 BMP/PNG 缓冲。二者职责分离,勿混用。完整对照见 图像处理模块总览。
字节流 / 句柄所有权对照
| 接口 | 对象是什么 | 如何释放 |
|---|---|---|
| GetImageData | 句柄内部的 BGRA 像素视图(与 OLAImage 同生命周期) | 只调 FreeImagePtr(imgPtr);禁止 FreeImageData(data) |
| GetImageBmpData | 新分配的完整 BMP 文件字节 | 必须 FreeImageData(data),句柄另调 FreeImagePtr |
| GetImagePngData | 新分配的完整 PNG 文件字节 | 必须 FreeImageData(data),句柄另调 FreeImagePtr |
| FreeImagePtr | 释放 OLAImage 图像句柄 | 不释放上述 BMP/PNG 的 data |
| FreeImageData(本接口) | 释放独立堆分配的字节缓冲 | 不释放图像句柄 |
| 项目 | 说明 |
|---|---|
| 与 FreeImagePtr 关系 | 互不替代、互不自动调用。导出 BMP/PNG 后通常两者都要调:先 FreeImageData(data),再 FreeImagePtr(imgPtr)。 |
| 勿对 GetImageData 使用 | GetImageData 的 data 属于句柄内部像素,对其 FreeImageData 会导致崩溃或堆损坏。 |
| 勿对句柄使用 | 图像句柄只能 FreeImagePtr / SDK FreeImage。 |
| 重复释放 | 同一 data 不要重复 FreeImageData。 |
